package org.tri.persistence.search;

import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;
import org.tri.entity.Establecimiento;
import org.tri.entity.Productor;

/**
 * La clase {@code BusquedaEstablecimiento} permite realizar busquedas
 * de establecimientos, filtrando la misma según ciertos criterios.
 * @author kiira
 * @version 1.0, Nov 20, 2011
 */
public class BusquedaEstablecimiento extends Busqueda<Establecimiento> {

    /**
     * Inicializa la búsqueda.
     */
    public BusquedaEstablecimiento() {
        super( Establecimiento.class );

    }//end constructor    

    /**
     * Restringe la busqueda a los establecimientos cuya
     * renspa empieze con la {@code String} indicada.
     * @param renspa renspa o porción de renspa por la cual
     * filtrar
     */
    public void porRenspa( String renspa ) {
        //creamos y agregamos la restriccion
        Criterion restriccionRenspa = Restrictions.sqlRestriction(
                String.format( "CAST( {alias}.renspa as string ) like '%s%%'",
                               renspa ) );

        agregarCriterio( restriccionRenspa );

    }//end método porRenspa

    /**
     * Restringe la busqueda a los establecimientos cuya
     * renspa contengan el número indicado.
     * @param renspa renspa o porción de renspa por la cual
     * filtrar
     */
    public void porRenspa( Long renspa ) {
        porRenspa( String.valueOf( renspa ) );

    }//end método porRenspa

    /**
     * Restringe la búsqueda a un solo resultado, identificado
     * por la renspa indicada.
     * @param renspa respa por la cual filtrar.
     */
    public void porRenspaExacto( Long renspa ) {
        //creamos y agregamos la restriccion
        Criterion restriccionRenspa = Restrictions.eq( "renspa", renspa );

        agregarCriterio( restriccionRenspa );

    }//end método porRenspaExacto

    /**
     * Restringe la busqueda a través del cuig.
     * @param cuig cuig  o porción del cuig por el cual 
     * filtrar.
     */
    public void porCuig( String cuig ) {
        //creamos y agregamos la restriccion
        Criterion restriccionCuig = Restrictions.like( "cuig", cuig + "%" );

        agregarCriterio( restriccionCuig );

    }//end método porCuig

    /**
     * Restringe la busqueda a través del nombre del
     * establecimiento.
     * @param nombre nombre o porcion del nombre por el cual 
     * filtrar.
     */
    public void porNombre( String nombre ) {
        //creamos y agregamos la restriccion
        Criterion restriccionNombre = Restrictions.like( "nombre", 
                                                         "%" + nombre + "%" );

        agregarCriterio( restriccionNombre );

    }//end método porNombre  

    /**
     * Restringe la busqueda a aquellos establecimientos
     * que correspondan al productor indicado.
     * @param productor productor por el cual filtrar.
     */
    public void porProductor( Productor productor ) {
        //creamos y agregamos la restriccion
        Criterion restriccionProductor = Restrictions.sqlRestriction(
                String.format( "{alias}.productor = %d", 
                               productor.getIdProductor() ) );

        agregarCriterio( restriccionProductor );

    }//end método porProductor

}//end clase BusquedaEstablecimiento

